/*************************************郑州精铖电力设备有限公司*****************************************************
** 通讯实验室-LoRa模块
** 研发部编写，工程专用
** 版权所有，盗版必究
************************************************文件描述***********************************************************
** 文件名：LoRa_Dri.c
** 描  述：LoRa 底层驱动函数源文件
**
************************************************历史版本***********************************************************
** 作者：
** 日期：
** 版本：
**
************************************************使用版本***********************************************************
** 作者：李康
** 日期：20191128
** 版本：V1.0
**
**************************************************说明*************************************************************
**LoRa模块片选引脚定义----->   LoRa_CS
**LoRa模块片SPI句柄总线定义----->   hspi1
************************************http://www.jingchengdianli.com************************************************/

/*************************************************库头文件*********************************************************/

#include <LoRa_App.h>
#include <LoRa_Dri.h>
#include <LoRa_Reg.h>
/***********************************************底层驱动库头文件***************************************************/
#include "spi.h"

/**************************************************全局变量********************************************************/

/***************************************************************************
* 函 数 名:  LoRa_RW(void)
* 函数功能:  LoRa模块读写封装
* 输    入:  Txdata 发送的数据
*
* 输    出:  无
*
* 返    回:  接收到的数据
*
* 备    注:  无
* 作    者:  李康
* 日	期:  2019-11-28
****************************************************************************/
uint8_t LoRa_RW(uint8_t Txdata)
{
	uint8_t Rxdata;
	HAL_SPI_TransmitReceive(&SpiHandle,&Txdata,&Rxdata,1,0xff);
	return Rxdata;
}

/***************************************************************************
* 函 数 名:  LoRa_WriteBuffer
* 函数功能:  LoRa模块写数组
* 输    入:  addr 发写数据的地址	*buffer数组所在的位置	size 数据长度
*
* 输    出:  无
*
* 返    回:  无
*
* 备    注:  无
* 作    者:  李康
* 日	期:  2019-11-28
****************************************************************************/
void SX1276WriteBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
{
    CS_L();    //片选拉低(数据传输开始)
    LoRa_RW(addr|0x80);	
    for(uint8_t i = 0; i < size;i++)
    {
        LoRa_RW( buffer[i] );	//SPI写入一个Byte数据
    }
    CS_H();	//片选拉高(数据传输结束)
}


/***************************************************************************
* 函 数 名:  LoRa_ReadBuffer
* 函数功能:  LoRa模块读取数组
* 输    入:  addr 要读取数据的地址	*buffer数组所在的位置	size 数据长度
*
* 输    出:  无
*
* 返    回:  无
*
* 备    注:  无
* 作    者:  李康
* 日	期:  2019-11-28
****************************************************************************/
void SX1276ReadBuffer( uint8_t addr, uint8_t *buffer, uint8_t size )
{
    CS_L();	//片选拉低(数据传输开始)
    LoRa_RW( addr & 0x7F );			
    for(uint8_t i = 0; i < size; i++ )
    {
        buffer[i] = LoRa_RW( 0 );	
    }
    CS_H();	//片选拉高(数据传输结束)
}

/***************************************************************************
* 函 数 名:  LoRa_Write
* 函数功能:  LoRa模块写数据
* 输    入:  addr 要读取数据的地址	data 要写入的数据
*
* 输    出:  无
*
* 返    回: 无
*
* 备    注:  无
* 作    者:  李康
* 日	期:  2019-11-28
****************************************************************************/
void SX1276Write(uint8_t addr, uint8_t data)
{
    CS_L();	//片选拉低(数据传输开始)
	LoRa_RW(addr|0x80);
	LoRa_RW(data);		
	CS_H();
}


/***************************************************************************
* 函 数 名:  LoRa_Read
* 函数功能:  LoRa模块读取数据
* 输    入:  addr 要读取数据的地址
*
* 输    出:  无
*
* 返    回: 该地址的数据
*
* 备    注:  无
* 作    者:  李康
* 日	期:  2019-11-28
****************************************************************************/
void SX1276Read( uint8_t addr, uint8_t *data )
{
	CS_L();	//片选拉低(数据传输开始)
    LoRa_RW(addr & 0x7F);
	data[0]=LoRa_RW(0);		
	CS_H();
}

/***************************************************************************
* 函 数 名:  LoRa_WriteFifo
* 函数功能:  LoRa模块写FIFO
* 输    入: buffer 数据的存放地址	size数据长度
*
* 输    出:  无
*
* 返    回:  无
*
* 备    注:  无
* 作    者:  李康
* 日	期:  2019-11-28
****************************************************************************/
void SX1276WriteFifo( uint8_t *buffer, uint8_t size )
{
    SX1276WriteBuffer( 0, buffer, size );
}

/***************************************************************************
* 函 数 名:  LoRa_ReadFifo
* 函数功能:  LoRa模块读FIFO
* 输    入:  buffer 读取数据的存放地址	size数据长度
*
* 输    出:  无
*
* 返    回:  无
*
* 备    注:  无
* 作    者:  李康
* 日	期:  2019-11-28
****************************************************************************/
void SX1276ReadFifo( uint8_t *buffer, uint8_t size )
{
    SX1276ReadBuffer( 0, buffer, size );
}

